package com.pay.demo.model;

import com.pay.demo.enums.PayStatusChangeEventEnum;
import com.pay.demo.enums.PayStatusEnum;
import com.pay.demo.model.base.PayModel;
import com.pay.demo.tech.statemachine.PayStateMachineContext;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

/**
 * @program: demo
 * @description: B通道支付流程的具体实现
 * @author: guoxh
 * @create: 2019-04-01 14:46
 **/
@Slf4j
@Component
@Scope("prototype")
public class BPayModel extends PayModel {

    @Override
    public void createPayOrder() {
        log.info("创建B通道订单,订单serialsNumber:{}", this.getPayTransaction().getSerialsNumber());
        //初始化流水
        this.createOriginOrder();
        //1.参数准备
        //2.请求第三方创建订单
        //3.解析返回报文
        //4.根据成功、失败触发事件(状态机) CREATE_ORDER_SUCCESSFUL_EVENT、CREATE_ORDER_FAIL_EVENT
        PayStateMachineContext context = PayStateMachineContext.getInstance(this.getPayTransaction().getSerialsNumber(), this);
        this.triggerEvent(this.getPayTransaction().getStatus(), PayStatusChangeEventEnum.CREATE_ORDER_SUCCESSFUL_EVENT, context);
    }

    @Override
    public void sendPaySms() {
        log.info("B通道支付短信,订单serialsNumber:{}", this.getPayTransaction().getSerialsNumber());
        //1.参数准备
        //2.请求第三方发送短信
        //3.解析返回报文
        //4.根据成功、失败触发事件(状态机) SEND_SMS_SUCCESSFUL_EVENT、SEND_SMS_FAIL_EVENT
        PayStateMachineContext context = PayStateMachineContext.getInstance(this.getPayTransaction().getSerialsNumber(), this);
        this.triggerEvent(this.getPayTransaction().getStatus(), PayStatusChangeEventEnum.SEND_SMS_SUCCESSFUL_EVENT, context);
    }

    @Override
    public void payConfirm() {
        log.info("B通道确认支付,订单serialsNumber:{}", this.getPayTransaction().getSerialsNumber());
        //1.参数准备
        //2.请求第三方确认支付
        //3.解析返回报文
        //4.根据成功、失败触发事件(状态机) ACCEPT_SUCCESSFUL_EVENT、ACCEPT_FAIL_EVENT
        PayStateMachineContext context = PayStateMachineContext.getInstance(this.getPayTransaction().getSerialsNumber(), this);
        this.triggerEvent(this.getPayTransaction().getStatus(), PayStatusChangeEventEnum.ACCEPT_SUCCESSFUL_EVENT, context);
        //5.支付成功 第三方一般给出两种解决方案——回调订单最终状态、商户主动获取订单最终状态

    }

    @Override
    public void finishPayOrder(PayStatusEnum payStatusEnums) {
        log.info("B通道确认订单最终状态,订单serialsNumber:{}", this.getPayTransaction().getSerialsNumber());
        /*回调方式*/
        //1.解析返回报文
        //2.根据成功、失败触发事件(状态机) PAY_SUCCESSFUL_EVENT、PAY_FAIL_EVENT
        /*主动获取方式*/
        //1.参数准备
        //2.请求第三方获取订单的最终状态
        //3.解析返回报文
        //4.根据成功、失败触发事件(状态机) PAY_SUCCESSFUL_EVENT、PAY_FAIL_EVENT
        PayStateMachineContext context = PayStateMachineContext.getInstance(this.getPayTransaction().getSerialsNumber(), this);
        if (payStatusEnums.equals(PayStatusEnum.ZHIFU_CHENGGONG)) {
            this.triggerEvent(this.getPayTransaction().getStatus(), PayStatusChangeEventEnum.PAY_SUCCESSFUL_EVENT, context);
        }
    }
}
